/**
 * @copyright (C) COPYRIGHT 2022 Fortiortech Shenzhen
 * @file      main.c
 * @author    Fortiortech  Appliction Team
 * @since     Create:2021-05-14
 * @date      Last modify:2022-07-14
 * @note      Last modify author is Marcel He
 * @brief     包含主函数，软硬件初始化函数，VRER配置函数,Debug小工具
 */

/********************************************************************************
    Header Definition
********************************************************************************/
#include <MyProject.h>
#include <SanityCheck.h>
#include "pressure.h"
#include "pid.h"
#include "application.h"
#include "separator.h"

uint8 data g_1mTick = 0;              ///< 1ms滴答信号，每隔1ms在SYSTICK定时器被置1，需在大循环使用处清零
unsigned short tim3_can_send_cnt = 0; // CAN 发送报文的计数值，在 timer3 10ms 中断中累加，在 while(1) 中清零
unsigned char tim3_10ms_flag;         // Timer3 10ms 中断标志位，在中断函数中置1，在 while(1) 中清零

separator_t xdata separator;
work_state_t main_state;

void vref_config(void);
void systick_init(void);
static void press_loop_adjust(void);

/**
 * @brief        主函数，大循环运行偏置电流采集函数，电机状态机控制函数，以及环路响应函数
 * @date         2022-07-14
 */
void main(void)
{
    uint16 PowerUpCnt = 0;

    /* 上电空指令延时 等待系统稳定 */
    for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);

    motor_ctrl_state = ready;
    mcFaultSource = FaultNoSource;

    MotorcontrolInit();
    VariablesPreInit();
    vref_config(); // 配置参考电压
    GPIO_Init();
    ADC_Init();
    Driver_Init();
    AMP_Init();
    Timer3_Init();
    TSD_Init();

    CMP3_Interrupt_Init();
    systick_init();

    can_init();
    pid_init();
	separator_init(&separator);
	main_state = standby;

    while (1)
    {
        if (!mcCurOffset.OffsetFlag)
        {
            GetCurrentOffset(); // 获取电流采样偏置电压
        }
        else
        {
            MC_Control(); // 电机控制状态机
        }

        /* 1ms处理函数 */
        if (g_1mTick)
        {
            TickCycle_1ms();
            g_1mTick = 0;
        }

        /* 同步数据 */
        if (tim3_10ms_flag)
        {
            // 写入电机转速
            unsigned short tmp;
            tmp = foc_control.speed_filtered;
            tmp = ((float)tmp / 32767) * MOTOR_SPEED_BASE;
            tmp /= 4;
            can_send_msg.data2 = (unsigned char)(tmp & 0x00FF);
            can_send_msg.data3 = (unsigned char)((tmp & 0xFF00) >> 8);
            tim3_10ms_flag = 0;
        }

        if (tim3_can_send_cnt >= 100)
        {
            can_send();
            tim3_can_send_cnt = 0;
        }
		
		// 工作逻辑
		
    }
}

void systick_init(void)
{
    /*  SYSTICK定时器配置  */
    ClrBit(IP2, PTIM41); // 1ms定时中断优先级别为1
    SetBit(IP2, PTIM40);
    SetBit(DRV_SR, SYSTIE);
    EA = 1;
}

/**
 * @brief   参考电压，偏置电压配置
 */
void vref_config(void)
{
    /* 配置参考电压 VREF 电压值 */
    ClrBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V   01-->VDD5
    SetBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V   11-->4.0V

    /* VHALF 电平配置 */
    SetBit(VREF_VHALF_CR, VHALFSEL1); // 00-->1/8     01-->1/4
    SetBit(VREF_VHALF_CR, VHALFSEL0); // 00-->25/64   11-->1/2

    /* P35 引脚配置 */
    SetBit(P3_AN, P35); //  配置 P35 为模拟
    SetBit(P3_OE, P35); //  配置 P35 为输出

    /* P32 引脚配置 */
    SetBit(P3_AN, P32); //  配置 P35 为模拟

    /* 使能输出功能 */
    SetBit(VREF_VHALF_CR, VREFEN | VHALFEN); // VREF_VHALF_CR = 0x11;
}

//static void press_loop_adjust(void)
//{
//    if (press_sensor.pressure_value < -1)
//    {
//        foc_control.ref += S_Value(100);
//    }
//}
